package com.hy.config;

import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.hy.admin.pojo.User;
import com.hy.util.AuthContextUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@Component
@Slf4j
public class AuthInterceptor implements HandlerInterceptor {

    @Autowired
    private RedisTemplate<String, String> redisTemplate;

    private static final String TOKEN_HEADER = "Authorization"; // 自定义 Header 名称
    private static final String TOKEN_PREFIX = "Bearer "; // Token 前缀

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        String token = request.getHeader(TOKEN_HEADER); // 获取请求头中的 token

        if (StringUtils.isNotEmpty(token) && token.startsWith(TOKEN_PREFIX)) {
            // 移除 Bearer 前缀
            String jwtToken = token.substring(TOKEN_PREFIX.length());

            try {
                // 获取用户信息，可以从Redis获取或者从JWT中解析用户信息
                User user = getUserFromToken(jwtToken); // 解析JWT Token并获取用户信息
                if (user != null) {
                    AuthContextUtil.set(user); // 设置到ThreadLocal
                    return true; // 放行请求
                }
            } catch (Exception e) {
                // 解析Token异常，打印日志并返回未授权响应
                log.error("Token解析失败: {}", e.getMessage());
                response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
                response.getWriter().write("未授权，请登录");
                return false;
            }
        }

        // 如果没有token或者token无效，则返回未授权的错误提示
        response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
        response.getWriter().write("未登录或Token无效");
        return false;
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // 清理ThreadLocal中的用户信息
        AuthContextUtil.remove();
    }

    /**
     * 从Token中解析用户信息（假设你有解析JWT的工具方法）
     * @param token
     * @return User
     */
    private User getUserFromToken(String token) {
        // 假设是从Redis中获取用户信息
        String userId = redisTemplate.opsForValue().get(token);
        if (StringUtils.isNotEmpty(userId)) {
            // 通过userId从数据库或者缓存中获取用户信息
            User user = getUserFromDatabase(userId);
            return user;
        }
        return null;
    }

    /**
     * 假设通过userId从数据库获取用户信息
     * @param userId
     * @return User
     */
    private User getUserFromDatabase(String userId) {
        // 这里可以调用数据库查询，或者其他服务获取用户信息
        // 例如：userRepository.findById(userId);
        return new User(); // 这只是一个占位，实际代码中需要获取真实的用户信息
    }
}
